{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "3756abf2-063f-49db-8db6-a07d49c97514",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-04-28T02:46:19.340293Z",
     "start_time": "2025-04-28T02:46:18.994927Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np     #只需要下载numpy库即可\n",
    "import random\n",
    "import GridWorld_v2\n",
    "from IPython.display import clear_output"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "d8b90273-e61d-440d-9d70-fa97c27739bb",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-04-28T02:46:21.343877Z",
     "start_time": "2025-04-28T02:46:21.340466Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "⬜️⬜️⬜️⬜️⬜️\n",
      "⬜️🚫🚫⬜️⬜️\n",
      "⬜️⬜️🚫⬜️⬜️\n",
      "⬜️🚫✅🚫⬜️\n",
      "⬜️🚫⬜️⬜️⬜️\n",
      "⬇️⬅️⬆️🔄➡️\n",
      "⬅️⏪⏪⬇️⬆️\n",
      "🔄⬇️⏬⬇️➡️\n",
      "⬆️🔄✅⏬⬇️\n",
      "⬅️⏫️⬇️🔄🔄\n"
     ]
    }
   ],
   "source": [
    "rows = 5      #记得行数和列数这里要同步改\n",
    "columns = 5\n",
    "gridworld = GridWorld_v2.GridWorld_v2(forbiddenAreaScore=-5000, score=100,desc = [\".....\",\".##..\",\"..#..\",\".#T#.\",\".#...\"]) \n",
    "gridworld.show()\n",
    "policy = np.eye(5)[np.random.randint(0,5,size=(rows*columns))] \n",
    "gridworld.showPolicy(policy)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "71840522-21e3-4496-85f4-ffaf52e728c5",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-04-28T02:46:30.057731Z",
     "start_time": "2025-04-28T02:46:25.737392Z"
    }
   },
   "outputs": [],
   "source": [
    "# 创建一个策略数组，形状为 (rows * columns, 5)，数组中的每个元素值都为 0.2\n",
    "policy = 0.2 * np.ones((rows*columns,5))\n",
    "# 生成 500 个轨迹得分，每次从 0 到 24 随机选择一个初始状态，从 0 到 4 随机选择一个动作，\n",
    "# 使用上述创建的策略，模拟 500 步，调用 gridworld.getTrajectoryScore 函数获取轨迹得分\n",
    "episodes = [gridworld.getTrajectoryScore(nowState = random.randint(0,24),action = random.randint(0,4),policy = policy,steps = 500) \n",
    "            for i in range(500)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "7ad5762c-1240-49f6-9463-225d70cff032",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-04-28T02:46:33.087666Z",
     "start_time": "2025-04-28T02:46:32.989346Z"
    }
   },
   "outputs": [],
   "source": [
    "# 随机生成一个包含25个元素的一维数组，用于存储每个状态的价值估计\n",
    "state_value = np.random.randn(25)\n",
    "# 定义学习率，用于控制每次更新状态价值时的步长\n",
    "learning_rate = 0.01\n",
    "# 定义折扣因子，用于计算未来奖励的折现值\n",
    "gamma = 0.99\n",
    "# 外层循环，迭代500次，控制训练的总轮数\n",
    "for i in range(500):\n",
    "    # 内层循环，遍历第i轮中的每个轨迹\n",
    "    for trajectory in episodes[i]:\n",
    "        # 从轨迹中解包当前状态、当前动作、即时得分、下一个状态和下一个动作\n",
    "        tmpstate, tmpaction, tmpscore, nextState, nextAction = trajectory\n",
    "        # 计算时间差分（TD）误差，即当前状态价值估计与目标值之间的差值\n",
    "        TD_error = state_value[tmpstate] - (tmpscore + gamma * state_value[nextState])\n",
    "        # 根据TD误差更新当前状态的价值估计\n",
    "        state_value[tmpstate] = state_value[tmpstate] - learning_rate * TD_error"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "b557f7ca-8af1-43c8-94fd-a3c19d370024",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-04-28T02:46:36.098810Z",
     "start_time": "2025-04-28T02:46:36.096801Z"
    }
   },
   "outputs": [],
   "source": [
    "state_value = np.round(state_value,decimals=3).reshape(5,5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "82947a43",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-04-28T02:46:37.924970Z",
     "start_time": "2025-04-28T02:46:37.921332Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-69967.824, -72328.516, -70801.486, -66298.32 , -62852.907],\n",
       "       [-72871.023, -75987.924, -75505.484, -69841.601, -64903.   ],\n",
       "       [-74639.294, -79080.459, -77656.285, -73279.04 , -67109.999],\n",
       "       [-76813.013, -79345.962, -78726.154, -73467.972, -68961.467],\n",
       "       [-76973.965, -78976.614, -75688.716, -71795.655, -68180.51 ]])"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "state_value"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "eea8a3a7-b607-44b3-867c-972c1be707f3",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-04-28T02:47:11.727018Z",
     "start_time": "2025-04-28T02:47:11.278307Z"
    }
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "from mpl_toolkits.mplot3d import Axes3D"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "fd3f03b2-8011-44cf-aaa1-479c71405976",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-04-28T02:47:13.450672Z",
     "start_time": "2025-04-28T02:47:13.307435Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<mpl_toolkits.mplot3d.art3d.Poly3DCollection at 0x20dcb847ef0>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.linspace(0,5,5)\n",
    "y = np.linspace(0,5,5)\n",
    "\n",
    "X, Y = np.meshgrid(x,y)\n",
    "\n",
    "fig = plt.figure()\n",
    "ax = fig.add_subplot(111, projection = '3d')\n",
    "ax.plot_surface(Y,X,state_value, cmap='viridis')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d1f35efb-a988-4fc1-8fc0-b91709c1beec",
   "metadata": {},
   "source": [
    "===================下面用TD拟合state value 进而得到action value 从而更新策略 ===================="
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "6f0be645-73c7-44ef-a92c-d57879825e6a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-04-28T02:47:38.719565Z",
     "start_time": "2025-04-28T02:47:38.717111Z"
    }
   },
   "outputs": [],
   "source": [
    "gamma = 0.999   #折扣因子，越接近0越近视\n",
    "trajectorySteps = 20000\n",
    "learning_rate = 0.01\n",
    "num_episodes = 60000"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "f3f4385c-69a3-4152-8ca1-da361fdf4719",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-04-28T02:47:41.429128Z",
     "start_time": "2025-04-28T02:47:41.426622Z"
    }
   },
   "outputs": [],
   "source": [
    "policy = np.eye(5)[np.random.randint(0,5,size=(rows*columns))] \n",
    "state_value = np.zeros((rows * columns))\n",
    "qtable = np.zeros((rows * columns,5))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "c02c662a-8032-4db7-863a-eb0af6061e28",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-04-28T02:47:43.933129Z",
     "start_time": "2025-04-28T02:47:43.930814Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "⬜️⬜️⬜️⬜️⬜️\n",
      "⬜️🚫🚫⬜️⬜️\n",
      "⬜️⬜️🚫⬜️⬜️\n",
      "⬜️🚫✅🚫⬜️\n",
      "⬜️🚫⬜️⬜️⬜️\n",
      "➡️⬇️⬇️⬇️➡️\n",
      "⬅️⏩️🔄⬅️➡️\n",
      "⬅️⬇️⏪⬇️🔄\n",
      "⬅️⏩️✅⏩️⬆️\n",
      "⬇️⏬⬅️⬇️⬅️\n",
      "random policy\n"
     ]
    }
   ],
   "source": [
    "gridworld.show()\n",
    "gridworld.showPolicy(policy)\n",
    "print(\"random policy\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "87d0e93120d98a41",
   "metadata": {},
   "outputs": [],
   "source": [
    "#下面实现类似于sarsa"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "55a61507-1f32-4431-aa4b-7e3b3c5825e4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0 0 0 0 0]\n",
      " [0 0 0 0 0]\n",
      " [0 1 0 0 0]\n",
      " [0 1 2 0 0]\n",
      " [0 0 0 0 0]]\n",
      "[[-10138.64626277  -8962.36104946  -4062.6112524   -1554.25327795\n",
      "    -785.27007846]\n",
      " [ -8021.33984115  -7586.01524572  -8586.52094404  -2155.39880027\n",
      "    -445.98977599]\n",
      " [ -5783.14109243  -6245.67301657  -2663.97684292  -3540.59893287\n",
      "    -239.71446702]\n",
      " [ -3310.61360969   -718.39651094    101.00799991   -642.79710313\n",
      "   -1114.46098781]\n",
      " [ -6465.54950099  -1615.27843621   -401.76284393   -996.19353215\n",
      "      57.99134127]]\n",
      "⬇️➡️➡️➡️⬇️\n",
      "⬇️⏬⏩️➡️⬇️\n",
      "⬇️⬇️⏬➡️🔄\n",
      "🔄⏩️✅⏪⬇️\n",
      "⬆️⏩️⬆️➡️🔄\n",
      "-3435.1025625477982\n",
      "epision:0.0001, p1:0.99992, p0:2e-05\n"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "Cell \u001b[1;32mIn[8], line 35\u001b[0m\n\u001b[0;32m     32\u001b[0m cnt \u001b[38;5;241m=\u001b[39m [\u001b[38;5;241m0\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(\u001b[38;5;241m25\u001b[39m)]\n\u001b[0;32m     34\u001b[0m \u001b[38;5;66;03m# 从当前状态i出发，执行动作j，根据epsilon-贪心策略生成轨迹，并获取轨迹得分,这里是为了产生大量的轨迹\u001b[39;00m\n\u001b[1;32m---> 35\u001b[0m Trajectory \u001b[38;5;241m=\u001b[39m \u001b[43mgridworld\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgetTrajectoryScore\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnowState\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mi\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maction\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mj\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpolicy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpolicy_epsilon\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msteps\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtrajectorySteps\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstop_when_reach_target\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[0;32m     36\u001b[0m \u001b[38;5;66;03m# 打印轨迹的步数\u001b[39;00m\n\u001b[0;32m     37\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrajectorySteps\u001b[39m\u001b[38;5;124m\"\u001b[39m,\u001b[38;5;28mlen\u001b[39m(Trajectory))\n",
      "File \u001b[1;32md:\\BaiduSyncdisk\\pytorch\\Reinforcement_Learning\\Code-of-RL-Beginning-main\\codes\\GridWorld_v2.py:139\u001b[0m, in \u001b[0;36mGridWorld_v2.getTrajectoryScore\u001b[1;34m(self, nowState, action, policy, steps, stop_when_reach_target)\u001b[0m\n\u001b[0;32m    136\u001b[0m score, nextState \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mgetScore(nowState, nowAction)\n\u001b[0;32m    137\u001b[0m \u001b[38;5;66;03m# 根据策略随机选择下一个动作，policy[nextState]是一个大小为5的列表，代表每个action的概率，概率总和为1，概率越大的action被选中的可能性越高\u001b[39;00m\n\u001b[0;32m    138\u001b[0m \u001b[38;5;66;03m#p是要传入的概率列表\u001b[39;00m\n\u001b[1;32m--> 139\u001b[0m nextAction \u001b[38;5;241m=\u001b[39m \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrandom\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mchoice\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mrange\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m5\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msize\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mreplace\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mp\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpolicy\u001b[49m\u001b[43m[\u001b[49m\u001b[43mnextState\u001b[49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m[\u001b[38;5;241m0\u001b[39m]\n\u001b[0;32m    141\u001b[0m \u001b[38;5;66;03m# 将当前状态、动作、得分、下一个状态和下一个动作添加到结果列表中\u001b[39;00m\n\u001b[0;32m    142\u001b[0m res\u001b[38;5;241m.\u001b[39mappend((nowState, nowAction, score, nextState, nextAction))\n",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "# 通过采样的方法计算action value，model free的话意味着不知道整个gridworld的概率了，所以不能直接套贝尔曼方程迭代求解\n",
    "\n",
    "# 初始化探索率epsilon\n",
    "epsilon = 1\n",
    "# 开始迭代指定数量的回合\n",
    "for episode in range(num_episodes):\n",
    "    # 如果epsilon大于0.0001，则每次迭代减少0.0001\n",
    "    if(epsilon > 0.0001) :\n",
    "        epsilon -= 0.0001\n",
    "    else:\n",
    "        # 确保epsilon不小于0.0001\n",
    "        epsilon = 0.0001\n",
    "    \n",
    "    # 计算策略中选择最优动作的概率\n",
    "    p1 = 1-epsilon * (4/5)\n",
    "    # 计算策略中选择非最优动作的概率\n",
    "    p0 = epsilon/5\n",
    "    # 打印当前回合的epsilon、p1和p0的值\n",
    "    print(f\"epision:{epsilon}, p1:{p1}, p0:{p0}\")\n",
    "    \n",
    "    # 创建一个字典，用于映射动作概率\n",
    "    d = {1:p1, 0:p0}\n",
    "    # 根据策略数组policy，利用字典d将其转换为epsilon-贪心策略数组\n",
    "    policy_epsilon = np.vectorize(d.get)(policy)\n",
    "    \n",
    "    # 随机选择一个初始状态的索引\n",
    "    i = random.randint(0,24)\n",
    "    # 随机选择一个初始动作的索引\n",
    "    j = random.randint(0,4)\n",
    "    \n",
    "    # 初始化一个长度为25的列表，用于记录每个状态的访问次数\n",
    "    cnt = [0 for i in range(25)]\n",
    "    \n",
    "    # 从当前状态i出发，执行动作j，根据epsilon-贪心策略生成轨迹，并获取轨迹得分,这里是为了产生大量的轨迹\n",
    "    Trajectory = gridworld.getTrajectoryScore(nowState=i, action=j, policy=policy_epsilon, steps=trajectorySteps, stop_when_reach_target=True)\n",
    "    # 打印轨迹的步数\n",
    "    print(\"trajectorySteps\",len(Trajectory))\n",
    "    \n",
    "    # 让智能体在最后一个状态自转一下，添加一个自转移的元组到轨迹中\n",
    "    Trajectory.append((17,4,1,17,4)) \n",
    "    \n",
    "    # 如果轨迹长度超过5000步，则跳过当前回合\n",
    "    if(len(Trajectory)>5000):\n",
    "        continue\n",
    "    # 清除输出，等待新的输出\n",
    "    clear_output(wait=True)\n",
    "    # 设置目标状态（索引为17）的状态值为100\n",
    "    state_value[17] = 100\n",
    "    # 注意这里的返回值是大小为(trajectorySteps+1)的元组列表，因为把第一个动作也加入进去了\n",
    "    # 计算轨迹的步数\n",
    "    steps = len(Trajectory) - 1\n",
    "    # 从轨迹的最后一步开始反向遍历\n",
    "    for k in range(steps,-1,-1):\n",
    "        # 解包轨迹中的元组，获取当前状态、动作、得分、下一个状态和下一个动作\n",
    "        tmpstate, tmpaction, tmpscore, nextState, nextAction = Trajectory[k]\n",
    "        # 增加当前状态的访问次数\n",
    "        cnt[tmpstate] += 1\n",
    "        # 计算时序差分（TD）误差\n",
    "        TD_error = state_value[tmpstate] - (tmpscore + gamma * state_value[nextState])\n",
    "        # 根据TD误差更新当前状态的状态值\n",
    "        state_value[tmpstate] = state_value[tmpstate] - learning_rate * TD_error\n",
    "    \n",
    "    # 打印每个状态的访问次数，重塑为5x5的矩阵\n",
    "    print(np.array(cnt).reshape(5,5))\n",
    "    # 遍历所有状态，下面是为了收敛，所以通过状态值去计算qtable（动作值）\n",
    "    for i in range(rows * columns):\n",
    "        # 遍历所有动作\n",
    "        for j in range(5):\n",
    "            # 获取在状态i执行动作j的得分和下一个状态\n",
    "            score,nextState = gridworld.getScore(i,j) \n",
    "            # 根据贝尔曼方程更新Q表中对应状态-动作对的值\n",
    "            qtable[i][j] = score + gamma * state_value[nextState]\n",
    "\n",
    "    # 打印状态值，重塑为5x5的矩阵\n",
    "    print(state_value.reshape(5,5))\n",
    "    # 显示当前策略\n",
    "    gridworld.showPolicy(policy)\n",
    "    # 打印状态值的平均值\n",
    "    print(np.array(state_value).mean())\n",
    "    \n",
    "    # 根据Q表的最优值更新策略，并用独热码表示\n",
    "    policy = np.eye(5)[np.argmax(qtable,axis=1)]  \n",
    "    # 根据更新后的策略重新计算epsilon-贪心策略数组\n",
    "    policy_epsilon = np.vectorize(d.get)(policy)\n",
    "\n",
    "    # break\n",
    "    # print(np.array(cnt).reshape(5,5))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "d3a8ea74-d550-4b8e-8d12-75cac359e49d",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-04-28T03:44:29.750554Z",
     "start_time": "2025-04-28T03:44:29.747471Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "⬇️➡️➡️➡️⬇️\n",
      "⬇️⏬⏩️➡️⬇️\n",
      "⬇️⬇️⏬➡️🔄\n",
      "🔄⏩️✅⏪⬇️\n",
      "⬆️⏩️⬆️➡️🔄\n"
     ]
    }
   ],
   "source": [
    "gridworld.showPolicy(policy) #上面运行时间过久可以直接暂停，可以看到TD算法效果不是很理想，下面是收敛到一个次优解"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "7a4a2364-442e-45ff-8a82-64fee05919ee",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.2, 0.2, 0.2, 0.2, 0.2],\n",
       "       [0.2, 0.2, 0.2, 0.2, 0.2],\n",
       "       [0.2, 0.2, 0.2, 0.2, 0.2],\n",
       "       [0.2, 0.2, 0.2, 0.2, 0.2],\n",
       "       [0.2, 0.2, 0.2, 0.2, 0.2],\n",
       "       [0.2, 0.2, 0.2, 0.2, 0.2],\n",
       "       [0.2, 0.2, 0.2, 0.2, 0.2],\n",
       "       [0.2, 0.2, 0.2, 0.2, 0.2],\n",
       "       [0.2, 0.2, 0.2, 0.2, 0.2],\n",
       "       [0.2, 0.2, 0.2, 0.2, 0.2],\n",
       "       [0.2, 0.2, 0.2, 0.2, 0.2],\n",
       "       [0.2, 0.2, 0.2, 0.2, 0.2],\n",
       "       [0.2, 0.2, 0.2, 0.2, 0.2],\n",
       "       [0.2, 0.2, 0.2, 0.2, 0.2],\n",
       "       [0.2, 0.2, 0.2, 0.2, 0.2],\n",
       "       [0.2, 0.2, 0.2, 0.2, 0.2],\n",
       "       [0.2, 0.2, 0.2, 0.2, 0.2],\n",
       "       [0.2, 0.2, 0.2, 0.2, 0.2],\n",
       "       [0.2, 0.2, 0.2, 0.2, 0.2],\n",
       "       [0.2, 0.2, 0.2, 0.2, 0.2],\n",
       "       [0.2, 0.2, 0.2, 0.2, 0.2],\n",
       "       [0.2, 0.2, 0.2, 0.2, 0.2],\n",
       "       [0.2, 0.2, 0.2, 0.2, 0.2],\n",
       "       [0.2, 0.2, 0.2, 0.2, 0.2],\n",
       "       [0.2, 0.2, 0.2, 0.2, 0.2]])"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "policy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ad4d0e51-d18d-4ec7-8753-3947d18fa357",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
